線上編輯器: TryCF
<cfparam>
<cfif>
<cfswitch>
<cfloop>
<cfinclude>
<cffunction>
建立自訂函數<cfoutput>
, cfdump <cfdump>
,<cfabort>
: 中斷程式執行語法: <cfset var1="Hello!">
規定:
_
與 $
,其他符號都不行型態: number, boolean, string, array date, list, structure, query, object
<!--- ... --->
作用: 1. 把CFML的變數內容或函式傳回值輸出到網頁, 2. 輸出資料庫的查詢結果。
#
用#
包起來,提醒coldfusion輸出字串前,先處理被#
包起來的變數或函式
<cfset dateTime = Now()>
<cfoutput>
當前時間: #dateTime#
</cfoutput>
#
為特殊意義, 要輸出#
或是包含#
的變數(顏色...)時,使用##
。
<cfoutput>
<font color="##FFOOOO">顏色</font>
</cfoutput>
如果少打一個#
,Coldfusion會認為FFOOOO
為一個變數而出錯
&
作用: 串聯字串,但 沒有 Javasript+
的運算功能
<cfset msg1="歡迎">
<cfset msg2="#msg1# 光臨">
<cfset msg3="msg1 光臨">
<cfset msg4=msg1&"光臨">
結果: msg2="歡迎光臨"
, msg3="msg1 光臨"
, msg4="歡迎光臨"
Coldfusion 透過在變數名稱前面加上前置詞,控制變數的有效範圍與來源。
<cfset Variables.myDog = "Lucky">
<cfoutput>
Dos' Name: #Variables.myDog#
</cfoutput>
前置詞: Variable
, Form
, URL
, Cookie
, Server
, Client
, ...
function
內的前置詞: [#arg argument.參數], [#this this.變數],控制變數只在在function
中有效<cfparam>
避免因變數尚未定義,產生的錯誤
三個基本屬性: name, default, type
<cfparam name="UR:.id" default="1" type="any">
<cfif>
, <cfswitch>
, <cfloop>
, <cfinclude>
<cfif>
<cfif 條件敘述>
條件成立,執行這裡
<cfelse>
條件不成立,執行這裡
</cfif>
eq
: 等於,也可以寫成 is
, equal
neq
: 不等於is not
, not equal
gt
: 大於,也可以寫成greater than
lt
: 小於,也可以寫成less than
ge
: 大於等於,也可以寫成greater than or equal to
, gte
le
: 小於等於,也可以寫成less than or equal to
, lte
contain
: 包含,範例"ColdFusion MX" contain "MX"
將回傳truedoes not contain
: 不包含<cfset hr = "3p">
<cfif ht is "15:00">
現在時間下午3點
</cfif>
and
, or
, not
xor
: true加false,false加true,兩種情況才會回傳trueeqv
: true加true,false加false,兩種情況才會回傳trueimp
: true加false,會回傳false<cfswitch>
效率比一連串ifesle好,易讀
<cfset number=3>
<cfswitch expression="#number#">
<cfcase value="1">
符合條件值時,執行這裡
</cfacse><cfcase value="2"></cfcase><cfcase value="3"></cfcase>
</cfswitch>
<cfcase value="1, 3">
變數NUMBER 可能是1 或3
</cfcase>
<cfcase value="1, 2"></cfcase>
<cfcase value="1, 3"></cfcase>
<cfcase value"banana|orange" delimiters="|">
<cfloop>
索引迴圈、條件迴圈
<cfloop index="counter" from="1" to="5" step="2">
大家好! <br>
</cfloop>
true
就會不斷執行,直到條件變為 false
<cfset counter=1>
<cfloop condition="counter LT 6">
大家好! <br>
<cfset counter = counter + 1>
</cfloop>
<cfinclude>
在頁面中包含另外一個網頁,好讓我們替網站頁面嵌入統的頁眉(header)與頁腳(footer)
字串處理、規則運算式、清單(list)、Array、Structure 變數
<cfset str=#x# & #y#>
Trim()
: <cfset user = Trim(Form.userName)>
RTrim()
: 去除第一個非空白字元的之前空格; LTrim()
: 去除最後一個非空白字元的之後空格;Compare(str1, str2)
<cfset str1="apple Pie">
<cfset str2="APPLE">
<cfset order=Compare(str1, str2)>
<cfoutput>
<cfswitch expression="#order#">
<cfcase value="-1">
#str1# 大於 #str2#
</cfcase>
<cfcase value="0">
#str1# 等於 #str2#
</cfcase>
<cfcase value="1">
#str1# 小於 #str2#
</cfcase>
</cfswitch>
</cfoutput>
CompareNoCase()
Find()
Find(搜尋字串, 被搜尋字串 [, 搜尋起點])
,大小寫有差別FindNoCase()
@
來達成
<!-- 讀取 email 表單欄位的值 -->
<cfset email=Form.email>
<!-- Len(): 字串長度 -->
<cfset emailLen=Len(email)>
<!-- 找尋 @ -->
<cfset firstAt = Find("@", email)>
<!-- 找不到時 firstAt = 0 -->
<cfset secondAt = Find("@", mail, firstAt + 1)>
<cfif sescondAt is not 0>
e-mail 只能有一個 @ 字元
<cfabort>
<cfelseif firstAt LTE 1 OR firstAt is emailLen>
請仔細填寫 e-mail !
</cfif>
Replace(來源字串, 要被替換字串, 替換內容, 搜尋範圍)
ReplaceNoCase()
one
只替換第一個找到的; 2. all
替換所有找 到的<cfset str1="apple Pie apple sida apple juice">
<cfset str2=Replace(str1, "apple", "orange", "all")>
<cfoutput>
替換前: #str1#
<br>
替換後: #str2#
</cfoutput>
Mid(字串, 起始編號, 字數)
,範例
<cfset email="ColdFusion@yahoo.com.tw">
<cfoutput>
網域名稱: #Mid(email, 12, 5)#
</cfoutput>
Left(字串, 字數)
: 從左邊開始數; Right(字串, 字數)
: 從右邊開始數@
之前的字串當作使用者名稱,@
之後當作網域
<cfset email="ColdFusion@yahoo.com.tw">
<cfset indexEmail=Find("@", email)>
<cfset userName=Left(email, indexEmail-1)>
<cfset emailLen=Len(email)>
<cfset domainName=Right(email, emailLen-indexEmail)>
<cfoutput>
使用者名稱: #userName#
<br>
網域: #domainName#
</cfoutput>
上面的搜尋方式為找到指定的字元,這邊可以透過特殊字元搜尋目邊的起始位子、出現頻率、字元的範圍等等
<cfset result=REFind("ColdFusion", "ColdFusion@yahoo.com")>
,result的值為字元的位子REFindNoCase("規則", 字串)
^
: 開頭; $
: 結尾; "^cubie$"
表示目標字串需要完全吻合\t
: 定位字元\s
: 任何空白字元(包含定位鍵以及換行...)\S
: 任何 非 空白字元\d
: 任何數字\D
: 任何 非 數字\w
: 任何字母與數字\W
: 任何 非 字母與數字\
, ,
, .
, -
使用\\
, \,
, \.
, \-
[a-z]
: 任何小寫字母[a-zA-Z]
: 任何大小寫字母[0-9]
: 任何數字[a-zA-Z0-9.]
: 任何大小寫字母, 數字, "."符號[[:punct:]]
: 匹配任何標點符號 (POSIX字元集合)<cfset result=REFindNoCase("^[^0-9][a-z0-9]$", target)>
{n}
: 匹配 n 個數量字元,如 p{2}
將匹配 "apple" 和 "apple" 的前面兩個 p{n, }
: 匹配 n 個或多個數量的字元{n, m}
: 匹配 n~m 個字元*
: 匹配多次 *
字元,範例: bo*
將匹配 "book" 的 boo與 "bike" 裡面的 b?
: 匹配 一次 ?
之前的字元,範例: books?
將匹配 book 與 books+
: 匹配多次 +
之前的字元,範例: o+
匹配 "book" 裡面 的 oo 與 "booook" 裡的 oooo.
: 匹配第 一個吻合以外 的所有字元,範例: .c
匹配 "clock" 的第二個 cx|y
: 匹配 x 或 y,範例: black|white|gray,匹配 "black", "white" 或 "gray"[\w]+@[\w]+\.[\w\.]+
<cfset listData="材, 米, 油, 鹽">
ValueList(資料查詢名稱.資料欄位 [, 界定符號])
'
語法: QutedValueList(bookTitle.title, ";")
<cfquery name="bookTitle" datasource="bookStore">
SELECT title FROM books
</cfquery>
<cfset titleList=ValueList(bookTitle.title, ";")>
//result: ActionScript;ColdFusion;APS.Net
<cfset titleList=QuetedValueList(bookTitle, ";")>
//result: 'ActionScript';'ColdFusion';'APS.Net'
<cfquery>
為查詢資料庫標籤的指令ListLen(list, "")
ListGetAt(清單, 位置編號, 界定符號)
ListAppend(清單, 值, 界定符號)
: 指定的值放在清單元素最後ListPrepend(清單, 值, 界定符號)
: 指定的值放在清單元素之前ListInsertAt(清單, 位置編號, 值, 界定符號)
: 指定值放在指定位置<cfset listData=newValue & "," & listData>
的方式效率更好ListDeleteAt(清單, 位置編號, 界定符號)
<cfset listData="材;米;油;鹽">
<cfset i=1>
<cfloop index="item" list="#listData#" delimiters=";">
<cfoutput>
元素 #i# : #item# <br>
</cfoutput>
<cfset i = i + 1>
</cfloop>
ListFind(搜尋對象, 要搜尋的內容)
: 可以搜尋、匹配清單的元素內容,只能和找尋對象一模一樣的內容ListFindNoCase(搜尋對象, 要搜尋的內容)
: 不分大小寫javascript <cfset listData="材,米,油,鹽"> <cfset orderList="米,鹽"> 尚未購買的商品: <br> <!-- <cfloop> 中的index,把每次迴圈取出的值暫存到product --> <cfloop list="#listData#" index="product"> <cfif ListFind(orderList, product) is 0> <cfoutput> #product#<br> </cfoutput> </cfif> </cfloop>
ListContains(搜尋對象, 要搜尋的內容)
: 比對包含搜尋內容的元素,回傳0(失 敗), 1(成功)ListContainsNoCase(搜尋對象, 要搜尋的內容)
: 不分大小寫<cfset listData = "Flash MX,FlashComm,Dreamviewer,flash ROM">
包含"flash"字串的元素: <br>
<cfloop list=#listData# index="word">
<cfset result=ListContainsNoCase(word, "flash")>
<cfif result neq 0>
<cfoutput>
#word#<br>
</cfoutput>
</cfif>
</cfloop>
ListValueCount(統計對象, 項目)
: 統計項目出現次數ListValueCountNoCase()
: 不分大小寫<cfset listData="贊成,反對,沒意見">
<cfset voteList="贊成,反對,沒意見,贊成,贊成,反對,反對,沒意見,沒意見,贊成,贊成,沒意見,反對,反對">
<h3>投票結果</h3>
<cfloop list=#listData# index="vote">
<cfoutput>
#vote#: #ListValueCount(voteList, vote)# 票<br>
</cfoutput>
</cfloop>
儲存許多相關資料,需要使用Array,Array元素從1開始依序編號
<cfset myArray = ArrayNew(1)>
: 建立Array,!ArrayNew()裡面的參數,代表維度,不是數量Arrayset(陣列變數的名稱,起始編號,結束編號,初始值)
: 初始化Array的函式AaaryLen()
: 傳回長度ArrayAppend(array, 值)
: 加入新的元素在array最後,成功會回傳TrueArrayPrepend(array, 值)
: 加入新的元素在array開頭,成功會回傳TrueArrayInsertAt(array,位置,值)
: 指定位置插入新的元素,成功會回傳TrueArrayDeleteAt(array, 位置)
: 指定位置刪除元素,刪除後後面元素自動遞補,成功會回傳TrueArraySwap(array,位置1,位置2)
: 交換位置1與位置2的元素,成功會回傳TrueArrayClear(array)
: 清除array內容,成功會回傳TrueArrayIsEmpty(array)
: 確認array是否沒有任何元素,沒有的話回傳TrueArraySort(array, 排序類型[,排列順序])
: 排序完成回傳True
ArrayToList(array, 分格符號)
: 將array換成列表,用分格符號分隔字串(輸出到網頁上常用)ArrayResize(array, 指定大小)
: 將array重新設定為指定大小<cfset scoresArray = ArrayNew(1)>
<cfset scoresArray[1] = 77>
<cfset scoresArray[2] = 66>
<cfset scoresArray[3] = 88>
<cfoutput>
原始內容: #ArrayToList(scoresArray, ", ")#<br>
</cfoutput>
<cfset temp=ArraySort(scoresArray, "Numeric")>
<cfoutput>
排序後: #ArrayToList(scoresArray, ", ")#
</cfoutput>
ArrayAvg(array)
: 平均值ArrayMax(array)
: 最大值ArrayMin(array)
: 最小值ArraySum(array)
: 總和<cfset scoresArray = ArrayNew(1)>
<cfset scoresArray[1] = 77>
<cfset scoresArray[2] = 66>
<cfset scoresArray[3] = 88>
<cfoutput>
總分:#ArraySum(scoresArray)#<br>
平均:#ArrayAvg(scoresArray)#<br>
最高:#ArrayMax(scoresArray)#<br>
最低:#ArrayMin(scoresArray)#<br>
</cfoutput>
結構變數就是 命名陣列(Associate Array),一般Array都是透過索引編號參照元素位置,結構變數可以用名稱來參照,這個名稱叫做 鍵值(key)
<cfset bookData = StructNew()>
: 建立結構變數<cfset bookData["title"] = "MX 與 XML 動態網站實作">
: 設定key<cfdump>
]標籤檢視資料:
<cfoutput>
顯示變數內容外,一般變數內容不可見的。<cfdump>
可以輸出內容讓我們開法更方便,var為必要參數var
: 指定查看的變數名稱,變數名稱要用##包起來expand
: boolean(Yes, No),設定是否展開結構內容,預設Yes,如果設No,始會列出結構的Key,不顯示內容label
: 設定標題文字<cfset bookData["title"] = "Flash MX">
<cfset bookData["author"] = "Harry">
<cfset bookData["price"] = 680>
<cfdump var=#bookData# label="書籍資料">
IsStruct(變數)
: 判斷變數是否是結構,回傳True, FalseStructCount()
: 計算Key數量StructEmpty(結構變數名稱)
:StructKeyExists(結構變數名稱, "key")
: 判斷指定的key 是否存在StructKeyList(結構變數名稱, 分界符號)
: 取出結構變數中的關鍵值StructKeyArray(結構變數名稱)
: 找尋結構中的keyStructDelete(結構變數名稱, key[, indicateNotExisting])
: 刪除結構中特定的元素StructClear(結構變數名稱)
: 清除結構中的全部資料Duplicate()
: 複製結構,存放在不同記憶體,兩邊不影響StructCopy()
: 複製結構,參照原有結構的記憶體,改任何一邊結構將影響另一邊結構<cfset bookData["title1"] = "Flash MX 寶典">
<cfset bookData["title2"] = "Flash XML 動態網站">
<cfset bookData["title3"] = "Dreamviewer">
<cfloop index="counter" from="1" to="#StructCount(bookData)#" step="1">
<cfoutput>
第#counter# 本書: #bookData["title" & counter]#<br>
</cfoutput>
</cfloop>
TimeFormat(date[,mask])
: 可以自訂時間的顯示格式,mask值如以下:
H
: 顯示12時制,1~9時 沒有 前導0Hh
: 顯示24時制,1~9時 有 前導0HH
: 顯示24時制,1~9時 有 前導0M
: 1~9 沒有 前導0的分鐘數mm
: 1~9 有 前導0的分鐘數S
: 1~9 沒有 前導0的秒數Ss
: 1~9 有 前導0的分鐘數T
: 上午或下午的標記,顯示A 或P 值Tt
: 上午或下午的標記,顯示AM 或 PM 值<cfoutput>
時間格式一: #TimeFormat(Now())#
<br>
時間格式二: #TimeFormat(Now(), "hh:mm:ss tt")#
</cfoutput>
DateFormat(date[,mask])
: 可以自訂日期的顯示格式,mask值如以下:
d
: 顯示一位或兩位數的日期,1~9時前面沒有0dd
:顯示兩位數日期,1~9前面有0ddd
: 顯示星期簡寫,如 Mon, Tue...dddd
: 顯示星期全名,如 Mondaym
: 顯示一位或兩位的月份,1~9前面沒有0mm
: 顯示兩位的月份,1~9前有有0mmm
: 顯示月份簡寫,如 Jan ...mmmm
: 顯示月份全名,如 January ...y
:顯示一位或兩位數的年份,1~9前面沒有0yy
: 顯示兩位數的年份,1~9前面有0yyyy
: 顯示四位數的年份<cfoutput>
時間格式一: #DateFormat(Now(), "yyyy/mm/dd")#
<br>
時間格式二: #DateFormat(Now(), "dddd, mmmm dd, yyyy")#
</cfoutput>
LSTimeFormat(date, [,mask])
: 區域性時間函數LSDateFormat(date, [,mask])
: 區域性日期函數<cfoutput>
#LSTimeFormat(Now(), "hh:mm:ss tt")#
</cfoutput>
<cfoutput>
時間格式一: #LSDateFormat(Now())#
<br>
時間格式二: #LSDateFormat(Now(), "yyyy年 mmmd 日 ddd")#
</cfoutput>
IsDefined
: 確認變數是否定義,回傳true代表有,false 代表沒有<cffunction>
<cffunction name="函數名稱" [returnType="傳回類型" roles="角色列表" access="存取類型" output="布林值"]>
程式內容
<cfreturn 運算式>
</cffunction>
<cfargument name="引數名稱" [Type="類型" required="布林值" default="預設值"]>
: 定義涵式的引數
<cffunction name="CFconverter">
<cfargument name="degree" default="0">
<cfargument name="type" default="C2F">
<cfif type EQ "C2F">
<cfset degree = 9/5*degree+32>
<cfelse>
<cfset degree = 5/9*(degree-32)>
</cfif>
<cfreturn DecimalFormat(degree)>
</cffunction>
<cfoutput>
#CFconverter(20, "C2F")#
</cfoutput>
this.變數
: 函式區域變數
<cffunction name="CtoF">
<cfargument name="degree">
<cfset this.result=9/5*degree+32>
<cfreturn this.result>
</cffunction>
常被用來變數設定, 條件判斷, 迴圈, 自訂函數
寫法與JS相似,但是在伺服器運行
<cfscript></cfscript>
一定要放程式,不能只放註解,不然會錯//
與 /* */
。var
WriteOutput()
,<cfoutput>
不能用<cfscript>
WriteOutput("這是""MX""版本");
//result: 這是"MX"版本
<cfscript>
<cfscript>
softArray = ArrayNew(1);
softArray[1] = "Flash";
softArray[2] = "yaiud";
</cfscript>
<cfscript>
user = StructNew();
user.ID = FORM.userID;
user.name = FORM.userName;
</cfscript>
if...else...
: 注意,比較運算子是CF的比較運算子,範例:
<cfset version = "MX">
<cfscript>
if(version eq "MX"){
WriteOutput("""MX""是最新的版本");
} else if(version eq "5.0"){
WriteOutput("5.0版也是很強大。");
} else {
WriteOutput("更新一下");
}
</cfscript>
switch...case
: 注意,要加break
,程式會一直執行到break
或是default
才離開switch
,語法:
switch(變數){
case 特定值 1:
//特定值 1 情況的程式碼
break;
case 特定值 2:
//特定值 2 情況的程式碼
break;
default:
//條件都不符合的情況,執行的程式碼
}
while
:
MOD
: 取餘數的運算子continue
: 強迫迴圈回到判斷式執行,不會執行continue
後面的程式<cfscript>
i = 1;
ans = 0;
while(i LTE 5){
if((i MOD 2) NEQ 0){
i += 1;
continue;
}
ans += i;
i += 1;
}
WriteOutput("運算結果:" &ans);
</cfscript>
for
: 範例
<cfscript>
i = 1;
ans = 0;
for(i = 1; i LTE 5; i++){
ans = ans + i;
}
WriteOutput("運算結果: #ans#");
</cfscript>
<cfscript>
function functionName(){
// 程式碼
}
</cfscript>
var
必須在function程式內容的開頭<cfscript>
function argTest(){
var args = ArrayLen(Arguments);
writeOutput("引數的數量: " &args& "<br>");
for(i = 1; i LTE args; i++){
writeOutput("第" & i & "個引數值: " & Arguments[i] & "<br>");
}
}
</cfscript>
<cfoutput>
#argTest(20, "Hello")#
</cfoutput>
當瀏覽器發出請求到服務器,Web服務器和瀏覽器創建這個環境變數,包含的資訊有IP位址、瀏覽器類型,驗證用戶名等等。要注意的是這個變數只能用來讀取不能修改。
<cfset var = 1 />
<cfparam name="foo#var#" default="default" />
<cfdump var="#foo1#" />